/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package adbus.models;

import adbus.libraries.*;
import java.sql.*;
//import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;

/**
 *
 * @author rafal
 */
/**główna klasa Kampanii*/
public class Kampania extends ORM {
    /**lista przechowująca przewoźników*/
    private PrzewoznikList carriers = null;
    /**lista przechowująca linie*/
    private LiniaList lines = null;
    /**lista przechowująca pojazdy*/
    private PojazdList vehicles = null;
    public DefaultListModel adverts = new DefaultListModel();
    private Klient k;
    private LinkedList<Reklama> doUsuniecia = new LinkedList<Reklama>();
    boolean reloadCarrier;
    /**
     * Ustanawia filtry i wywołuje metodę pobierz klasy przewoznik
     * @return PrzewoznikList
     */
    public PrzewoznikList pobierzDostepnychPrzewoznikow() {
            Przewoznik temp = new Przewoznik();
            temp.setAvailableFilter(data_rozpoczecia,data_zakonczenia);
            LinkedList<Przewoznik> prz = temp.pobierz();
            if(carriers == null) {
                carriers = new PrzewoznikList();
                carriers.setList(prz);
                //list.setList(prz);
                //carriers = list;
            } else {
                carriers.setList(prz);
            }
        return carriers;
    }
   /**metoda pobierająca klientow o określonym id*/
    public void pobierzWgId(int id) {
        setIDFilter(id);
        zaladuj();
    }
     public void setIDFilter(Integer id) {
        filters.put("id", "id_kampania = ?");
        filtersval.put("id", id);
     }
    public void alert() {
        JOptionPane.showMessageDialog(null, ((Przewoznik)carriers.getSelectedItem()).nazwa);
    }
    public LiniaList pobierzDostepneLinie() {
        //if(lines == null) {
            Linia temp = new Linia();
            temp.setAvailableFilter(data_rozpoczecia,data_zakonczenia);
            if(((Przewoznik)carriers.getSelectedItem()).id_przewoźnik!=null)
                temp.setCarrier(((Przewoznik)carriers.getSelectedItem()).id_przewoźnik);
            LinkedList<Linia> prz = temp.pobierz();
            if(lines == null) {
                lines = new LiniaList();
                lines.setList(prz);
                //list.setList(prz);
                //lines = list;
            } else {
                lines.setList(prz);
            }
         //   reloadCarrier = false;
        //}
        return lines;
    }

    /**metoda pobierająca pojazdy, które nie są zajete w zadanym momencie*/
    public PojazdList pobierzDostepnePojazdy() {
        Linia temp = (Linia) lines.getSelectedItem();
        
        if(vehicles == null) {
            vehicles = new PojazdList();

        }
        if (temp.id_linia!=null) {
            LinkedList<Pojazd> list = temp.pobierzPojazdy(data_rozpoczecia, data_zakonczenia);
            vehicles.setList(list);
        }

        return vehicles;
    }
    /**metoda dodaje reklame*/
    public void przypiszReklame(Reklama advert) {
        adverts.addElement(advert);
    }

    /**metoda zapisuje datę rozpoczęcia oraz zakończenia kampanii do zmiennych data_rozpoczecia i data_zakonczenia*/
    public void zapiszDate(String from, String to) {
        if(!(from.equals(data_rozpoczecia) && to.equals(data_zakonczenia)))
            reloadCarrier = true;
        data_rozpoczecia = from;
        data_zakonczenia = to;
        
    }
    /**metoda przypisuje id klienta do zmiennej id_klient*/
    public void przypiszKlienta(Klient c) {
        k = c;
        id_klient = k.id_klient;
    }
    /**metoda zapisująca lub aktualizująca tabele Kampanie*/
    public void zapisz() {
        if(id_kampania==null) {
            String q = "INSERT INTO Kampanie(id_kampania,id_klient,nazwa,opis,data_rozpoczecia,data_zakonczenia,data_dodania) " +
                    "VALUES(NULL,?,?,?,?,?,CURDATE());";
            LinkedHashMap<String, Object> hm = new LinkedHashMap<String, Object>();
            hm.put("1", id_klient);
            hm.put("2", nazwa);
            hm.put("3", opis);
            hm.put("4", data_rozpoczecia);
            hm.put("5", data_zakonczenia);
            ResultSet res = super.zapisz(q,"id_kampania",hm);
            try {
                id_kampania = res.getInt(1);
                System.out.println("ID Kampani: " + id_kampania);
            } catch (SQLException ex) {
                Logger.getLogger(Kampania.class.getName()).log(Level.SEVERE, null, ex);
            }
            for(Object ad: adverts.toArray()) {
                ((Reklama)ad).id_kampania = id_kampania;
                ((Reklama)ad).zapisz();
            }
        } else {
             String q = "UPDATE Kampanie SET id_klient = ?,nazwa=?,opis=?,data_rozpoczecia=?,data_zakonczenia=? WHERE id_kampania = ?";
            LinkedHashMap<String, Object> hm = new LinkedHashMap<String, Object>();
            hm.put("1", id_klient);
            hm.put("2", nazwa);
            hm.put("3", opis);
            hm.put("4", data_rozpoczecia);
            hm.put("5", data_zakonczenia);
            hm.put("6", id_kampania);
            ResultSet res = super.zapisz(q,"id_kampania",hm);
             for(Object ad: adverts.toArray()) {
                ((Reklama)ad).id_kampania = id_kampania;
                ((Reklama)ad).zapisz();
            }
             for(Reklama r: doUsuniecia) {
                // r.usun();
             }
        }
    }
    /**zmienna przechowująca id kampanii*/
    public Integer id_kampania;
    /**zmienna przechowująca id klienta*/
    public Integer id_klient;
    /**zmienna przechowująca date rozpoczęcia kampanii*/
    public String data_rozpoczecia;
    /**zmienna przechowująca date zakonczenia kampanii*/
    public String data_zakonczenia;
    /**zmienna przechowująca nazwe klienta*/
    public String nazwa;
    /**zmienna przechowująca opis kampanii*/
    public String opis;
    /**zmienna przechowująca date dodania kampanii*/
    public String data_dodania;
    public String klient;

    @Override
    /**metoda zwracająca połączone tabele Kampanie i Klienci*/
    public String basicQuery() {
        return "SELECT kamp.id_kampania, kl.nazwa as klient, kamp.nazwa, kamp.data_rozpoczecia, kamp.data_zakonczenia, " +
                "kamp.data_dodania, kamp.opis, kamp.id_klient " +
                "FROM Kampanie kamp INNER JOIN Klienci kl ON kamp.id_klient = kl.id_klient";
    }
    
    @Override
    public void zaladuj() {
        super.zaladuj();
        zaladuj(result);
    }

    public LinkedList<Kampania> pobierz() {
        LinkedList<Kampania> kampanie = new LinkedList<Kampania>();
        try {

            ResultSet krs = Database.querySelect(basicQuery() + getWhere(),filtersval);
            while(krs.next()) {
                Kampania kamp = new Kampania();
                kamp.zaladuj(krs);
                kampanie.add(kamp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Kampania.class.getName()).log(Level.SEVERE, null, ex);
        }
        return kampanie;
    }
    /**metoda wstawiająca dane z tabeli do odpowiednich zmiennych*/
    public void zaladuj(ResultSet set) {
        try {
            if(set.isBeforeFirst()) set.first();
            id_kampania = set.getInt("id_kampania");
            klient = set.getString("klient");
            nazwa = set.getString("nazwa");
            opis = set.getString("opis");
            data_rozpoczecia = set.getString("data_rozpoczecia");
            data_zakonczenia = set.getString("data_zakonczenia");
            data_dodania = set.getString("data_dodania");
            id_klient = set.getInt("id_klient");
            //set.getStatement().close();
        } catch (SQLException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public PrzewoznikList przewoznicy() {
        Przewoznik temp = new Przewoznik();
        temp.setCampaignFilter(this);
        LinkedList<Przewoznik> prz = temp.pobierz();
        if(carriers == null) {
            carriers = new PrzewoznikList();
            carriers.setList(prz);
        } else {
            carriers.setList(prz);
        }
        return carriers;
    }
    /**metoda usuwająca z tabeli Kampania wybraną kampanie (wg id_kampania)*/
    public void delete() {
        try {
            Database.queryUpdate("DELETE FROM Kampanie WHERE id_kampania = " + id_kampania, "id_kampania");
        } catch (SQLException ex) {
            Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    /**metoda filtrująca kampanie wg klienta(id_klient)*/
    void setClientFilter(Klient klient) {
        if(klient.id_klient!=null) {
            filters.put("klient", "kamp.id_klient = ?");
            filtersval.put("klient", klient.id_klient);
        } else {
            filters.remove("klient");
            filtersval.remove("klient");
        }
    }
    /**metoda filtrująca kampanie wg przewoźnika(id_przewoźnik)*/
    void setCarrierFilter(Przewoznik przewoznik) {
        if(przewoznik.id_przewoźnik!=null) {
            filters.put("przewoznik","id_kampania IN (SELECT k.id_kampania "
                    + "FROM Kampanie k "
                    + "JOIN Reklamy r ON k.id_kampania = r.id_kampania "
                    + "JOIN Pojazdy p ON p.id_pojazd = r.id_pojazdu "
                    + "JOIN Linie l ON l.id_linia = p.id_linia "
                    + "WHERE id_przewoźnik = ?)");
            filtersval.put("przewoznik", przewoznik.id_przewoźnik);
        } else {
            filters.remove("przewoznik");
            filtersval.remove("przewoznik");
        }
    }
    /**metoda filtrująca kampanie wg linii(id_linia)*/
    void setLineFilter(Linia linia) {
        if(linia.id_linia != null) {
            filters.put("linia","id_kampania IN (SELECT k.id_kampania "
                    + "FROM Kampanie k "
                    + "JOIN Reklamy r ON k.id_kampania = r.id_kampania "
                    + "JOIN Pojazdy p ON p.id_pojazd = r.id_pojazdu "
                    + "WHERE p.id_linia = ?)");
            filtersval.put("linia", linia.id_linia);
        }
    }

    /**metoda filtrująca kampanie wg daty rozpoczęcia i zakończenia kampanii)*/
    void setDateFilter(String dFrom, String dFrom2, String dTo, String dTo2) {
        if(!dFrom.equals("")) {
            filters.put("dfrom","data_rozpoczecia >=? ");
            filtersval.put("dfrom", dFrom);
        } else {
            filters.remove("dfrom");
            filtersval.remove("dfrom");
        }
        if(!dFrom2.equals("")) {
            filters.put("dfrom2","data_rozpoczecia <=?");
            filtersval.put("dfrom2", dFrom2);
        } else {
            filters.remove("dfrom2");
            filtersval.remove("dfrom2");
        }
        if(!dTo.equals("")) {
            filters.put("dto", "data_zakonczenia >=? ");
            filtersval.put("dto", dTo);
        } else {
            filters.remove("dto");
            filtersval.remove("dto");
        }if(!dTo2.equals("")) {
            filters.put("dto2", "data_zakonczenia <=? ");
            filtersval.put("dto2", dTo2);
        } else {
            filters.remove("dto2");
            filtersval.remove("dto2");
        }
    }

    public void setToDelete(Reklama reklama) {
        doUsuniecia.add(reklama);
    }
    /**metoda ładująca reklamy do listy*/
    public void zaladujReklamy() {
        Reklama temp = new Reklama();
        temp.setCampaignFilter(id_kampania);
        LinkedList<Reklama> tlist = new LinkedList<Reklama>();
        tlist.addAll(temp.pobierz());
        for(Object el: tlist) {
            adverts.addElement(el);
        }
    }

}
